package data

import (
	"context"
	"fmt"
	"net/url"

	"medicine/internal/biz"
	"medicine/internal/conf"

	"github.com/smartwalle/alipay/v3"
)

// AlipayClient 封装支付宝支付相关操作
// 你需要将 appId、私钥、公钥等配置放到 configs/config.yaml 并在 DataRepo 初始化时加载
// 这里只做演示，实际请用配置文件管理

// 新增获取配置的函数
func getAlipayConfig(conf *conf.Alipay) (appId, privateKey, publicKey, notifyUrl, returnUrl string) {
	if conf == nil {
		return "", "", "", "", ""
	}
	return conf.GetAppId(), conf.GetPrivateKey(), conf.GetPublicKey(), conf.GetNotifyUrl(), conf.GetReturnUrl()
}

//
// AlipayService 支付宝服务
// 可以挂载到 DataRepo 里
// 这里只做简单封装

type AlipayService struct {
	client    *alipay.Client
	notifyUrl string
	returnUrl string
}

func NewAlipayService(cfg *conf.Alipay) (*AlipayService, error) {
	if cfg == nil {
		return nil, fmt.Errorf("alipay config is nil, 请检查 config.yaml 的 data.alipay 配置")
	}
	client, err := alipay.New(cfg.AppId, cfg.PrivateKey, false)
	if err != nil {
		return nil, err
	}
	if err := client.LoadAliPayPublicKey(cfg.PublicKey); err != nil {
		return nil, err
	}
	return &AlipayService{
		client:    client,
		notifyUrl: cfg.NotifyUrl,
		returnUrl: cfg.ReturnUrl,
	}, nil
}

// GeneratePayURL 生成电脑网站支付链接
func (a *AlipayService) GeneratePayURL(ctx context.Context, orderId string, subject string, amount float64) (string, error) {
	p := alipay.TradePagePay{}
	p.NotifyURL = a.notifyUrl
	p.ReturnURL = a.returnUrl
	p.OutTradeNo = orderId
	p.Subject = subject
	p.TotalAmount = fmt.Sprintf("%.2f", amount)
	p.ProductCode = "FAST_INSTANT_TRADE_PAY"

	url, err := a.client.TradePagePay(p)
	if err != nil {
		return "", err
	}
	return url.String(), nil
}

// VerifyNotify 校验支付宝回调签名
func (a *AlipayService) VerifyNotify(params map[string]string) (bool, error) {
	values := url.Values{}
	for k, v := range params {
		values.Set(k, v)
	}
	err := a.client.VerifySign(values)
	return err == nil, err
}

// CreatePayUrl 根据订单生成支付宝支付链接（示例实现，实际可对接支付宝SDK）
func (a *AlipayService) CreatePayUrl(order *biz.SeckillOrder) (string, error) {
	// 这里只做演示，实际应调用支付宝SDK生成真实支付链接
	if order == nil {
		return "", nil
	}
	// 假设支付链接格式如下
	payUrl := "https://openapi.alipay.com/gateway.do?order_id=" + fmt.Sprint(order.ID)
	return payUrl, nil
}
